package com.ruoyi.demo2;

import com.ruoyi.entity.Address;
import com.ruoyi.entity.User;

import java.util.Optional;

/**
 * @description:
 * @author: xukaihang
 * @date: 2025/10/5
 */
public class OptionalTest {
    public static void main(String[] args) {
        // 场景：模拟从数据库获取用户信息，用户信息可能为null，如果通过null调用getName()会报错(空指针异常)
        // User user = null;
        // System.out.println(user.getName());

        // 传统写法
        // User user = User.builder()
        //         .name("xukaihang")
        //         .age(18)
        //         .email("<EMAIL>")
        //         .tenantId("296")
        //         .build();
        // if (user != null){
        //     System.out.println(user.getName());
        // }

        // User user = null;
        // String name = Optional.ofNullable(user).map(User::getName).orElse(null);
        // System.out.println(name);

        // User user = null;
        // Optional<User> userOpt = Optional.ofNullable(user);
        // 这里会编译报错，要求getAddress 返回 Optional<Address>，但是getAddress 却返回 Address，建议采用map 映射，将 Optional<Address> 转换为 Optional<String>
        // String safeCity = userOpt.flatMap(User::getAddress) // 这里 getAddress 返回 Optional<Address>
        //         .map(Address::getCity)
        //         .orElse("Unknown City");
        // System.out.println(safeCity);

        User user = User.builder()
                .name("xukaihang")
                .age(18)
                .email("<EMAIL>")
                .tenantId("296")
                .address(new Address("上海"))
                .build();
        Optional<User> userOpt = Optional.ofNullable(user);
        String safeCity = userOpt.map(User::getAddress)
                .map(Address::getCity)
                .orElse("Unknown City");
        System.out.println(safeCity);
    }
}
